package com.hmdp.utils;


import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;

@Component
@Slf4j
public class RedisIDWorker {


    /**
     * 从2025-01-01 00:00:00 开始
     */
    public static final long TIMESTAMP_START = 1735689600L;

    public static final int ORDER_BIT = 32;

    @Resource
    private StringRedisTemplate stringRedisTemplate;

    //生成全局唯一ID: 1+31+32
    public long createId(String prefix){

        //得到时间戳
        long curTime = LocalDateTime.now().toEpochSecond(ZoneOffset.UTC);
        long timeStamp = curTime - TIMESTAMP_START;

        //通过redis的自增得到序列号
        //在key中加入yyyy:MM:dd的前缀可以用于区分每一天的序列号和便于后期的统计
        String date = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy:MM:dd"));

        //increment：如果key不存在就创建key，并将value设置位0；如果存在就+1。
        //在redis中存储的是某一天的自增上限: irc:prefix:yyyy:MM:dd: number()
        long orderNumber = stringRedisTemplate.opsForValue().increment("irc:" + prefix +":"+ date);

        return timeStamp<< ORDER_BIT | orderNumber ;
    }




}
